What is R?


After installing the software, open RStudio


Set the folder RStudio uses when not in a project

  • From “Preferences” set the default folder to your documents or other convenient folder.

  • I set mine to my Dropbox folder.

  • After you have set the folder, quit and reopen RStudio.


Make a “project” for this course


Click “New Directory” for your project


Select “New Project”


Give the project folder a name


Your desktop should look something like this


Set the “Project Options”


Set the three options to “Yes”


RStudio has four panes


Packages

install.packages("AER", "dynlm", "fGarch", "FinCal", "kableExtra", "MASS", "reshape2", "stargazer", "tidyquant", "tidyverse", "wesanderson", "xtable", dependencies = TRUE)

library(AER)


Where are my files?

getwd()

setwd("/Users/Clinton/Dropbox/syncd_r_data/econometrics")

Special HIDDEN R files in your working directory


Using the “.Rprofile” file to configure an R session

# Portfolio Management .Rprofile file

# Auto-load packages:
library(AER)
library(broom)
library(data.table)
library(dynlm)
library(fBasics)
library(fGarch)
library(FinCal)
library(ggplot2)
library(kableExtra)
library(magrittr)
library(MASS)
library(matrixStats)
library(quadprog)
library(quantmod)
library(RColorBrewer)
library(reshape2)
library(rmarkdown)
library(stargazer)
library(timeSeries)
library(tseries)
library(wesanderson)
library(xtable)
library(xts)
library(tidyquant)
library(tidyverse)

# Set some of R options:
options(prompt="R> ", scipen=999, digits=4, width=80)


Rmarkdown and Notebooks


Install TinyTeX using the package called tinytex

tinytex::install_tinytex()


Test your Rmarkdown environment


Information on Rmarkdown and TinyTeX


Resources for R


CRAN Task Views


Books on R


R-Bloggers


RStudio Keyboard Shortcuts (for Mac)


© Copyright Clinton Watkins 2021


References

Andrecut, M. 2010. Portfolio Optimization in R.” Cornell University, arXiv:1307.0450 [q-fin.PM]. https://doi.org/10.1201/b17178.
Ang, Clifford S. 2021. Analyzing Financial Data and Implementing Financial Models Using R. Second. Springer Texts in Business and Economics. Cham: Springer International Publishing. https://doi.org/10.1007/978-3-030-64155-9.
Bennett, Mark J., and Dirk L. Hugen. 2016. Financial Analytics with R: Building a Laptop Laboratory for Data Science. Cambridge University Press. https://doi.org/https://doi.org/10.1017/CBO9781316584460.
Cowpertwait, Paul S. P., and Andrew V. Metcalfe. 2009. Introductory Time Series with R. Springer. https://doi.org/10.1007/978-0-387-88698-5.
Kleiber, Christian, and Achim Zeileis. 2008. Applied Econometrics with R. 1st ed. New York: Springer US. https://doi.org/10.1007/978-0-387-77318-6.
Matloff, Norman. 2011. The Art of R Programming: A Tour of Statistical Software Design. No Starch Press. https://www.nostarch.com/artofr.htm.
Pfaff, Bernhard. 2008. Analysis of Integrated and Cointegrated Time Series with R. Second. New York: Springer-Verlag. papers2://publication/uuid/2D6BDE05-D712-4D3C-99CD-72EADA215C83 http://www.springer.com/gp/book/9780387759661.
Tsay, Ruey S. 2010. Analysis of financial time series. Wiley.
———. 2014. Multivariate time series analysis : with R and financial applications. Wiley.
Venables, W. N., D. M. Smith, and R Core Team. 2019. An Introduction to R.” https://doi.org/10.1201/9781420035025.ch1.
LS0tCnRpdGxlOiAiRmluYW5jZSBEYXRhIFdvcmtzaG9wIFtFQ04zMzldIgpzdWJ0aXRsZTogIkEgR3VpZGUgdG8gU2V0dGluZy11cCBSIGFuZCBSU3R1ZGlvIgphdXRob3I6IDxicj4gQ2xpbnRvbiBXYXRraW5zCm91dHB1dDogaHRtbF9ub3RlYm9vawpiaWJsaW9ncmFwaHk6IC4uLy4uLy4uLy4uLy4uL2JpYnRleC9Qb3J0Zm9saW9NYW5hZ2VtZW50LmJpYgotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmgxLnRpdGxlIHsKICBmb250LXNpemU6IDI0cHQ7CiAgY29sb3I6IGRhcmtibHVlOwp9CgpoMy5zdWJ0aXRsZSB7CiAgZm9udC1zaXplOiAyNHB0OwogIGNvbG9yOiBkYXJrYmx1ZTsKfQoKaDIgewogIGZvbnQtc2l6ZTogMThwdDsKfQoKYm9keSwgdGQgewogICBmb250LXNpemU6IDExcHQ7Cn0KY29kZS5yewogIGZvbnQtc2l6ZTogOXB0Owp9CnByZSB7CiAgZm9udC1zaXplOiA5cHQKfQo8L3N0eWxlPgoKYGBge3IsIGluY2x1ZGU9Rn0Kcm0obGlzdCA9IGxzKCkpCmBgYAoKPGJyPgoKLS0tLQoKIyMgV2hhdCBpcyBSPwoKPHA+CgotIF9fUl9fIGlzIGFuIG9wZW5zb3VyY2UgcG93ZXJmdWwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2Ugc3VpdGVkIHRvIG1hdGhlbWF0aWNhbCBhbmQgc3RhdGlzdGljYWwgY29tcHV0aW5nLCBhbmFseXNpcyBhbmQgZ3JhcGhpY3MuIAoKICAgIC0gRG93bmxvYWQgUiBmcm9tIGhlcmU6IGh0dHBzOi8vd3d3LnItcHJvamVjdC5vcmcvIAogICAgCjxwPgoKLSBfX1JTdHVkaW9fXyBwcm92aWRlcyBhIGNvbnZlbmllbnQgaW50ZXJmYWNlIGZvciB1c2luZyBSLiBCb3RoIFIgYW5kIFJTdHVkaW8gYXJlIGZyZWUuCgogICAgLSBEb3dubG9hZCBSU3R1ZGlvIChmcmVlIERlc2t0b3AgT3BlbiBTb3VyY2UgRWRpdGlvbikgZnJvbSBoZXJlOiBodHRwczovL3d3dy5yc3R1ZGlvLmNvbS8gIAogICAgLSBfX1JTdHVkaW8gQ2xvdWRfXyBwcm92aWRlcyBSIGFuZCBSU3R1ZGlvIHZpYSBhIHdlYiBicm93c2VyLiBZb3UgY2FuIG1ha2UgYSBmcmVlIGFjY291bnQgYnV0IHRoZSBhbW91bnQgb2YgdGltZSB5b3UgY2FuIHVzZSB0aGUgc2VydmljZSBmb3IgZnJlZSBpcyBsaW1pdGVkLiBUaGlzIG1heSBiZSBhIGJhY2t1cCBvcHRpb24gaWYgeW91IGhhdmUgZGlmZmljdWx0aWVzIHNldHRpbmcgdXAgdGhlIHNvZnR3YXJlIG9uIHlvdXIgb3duIGNvbXB1dGVyLCBidXQgeW91IHdpbGwgbm90IGdldCBlbm91Z2ggdGltZSB0byBjb21wbGV0ZSB0aGUgd2hvbGUgY291cnNlIHVuZGVyIGEgZnJlZSBhY2NvdW50LiBSZW1lbWJlciB0byBjb3B5IGFueSBmaWxlcyB5b3UgbWFrZSBmcm9tIFJTdHVkaW8gQ2xvdWQgdG8geW91ciBvd24gY29tcHV0ZXIgc28gdGhhdCB5b3UgZG8gbm90IHJpc2sgbG9zaW5nIHlvdXIgd29yay4gUlN0dWRpbyBDbG91ZCBjYW4gYmUgZm91bmQgaGVyZTogaHR0cHM6Ly9yc3R1ZGlvLmNsb3VkLwoKPHA+CgotIFdlIHdpbGwgdXNlIFIgdmlhIFJTdHVkaW8gaW4gdGhpcyBjb3Vyc2UgdG8gYW5hbHlzZSBmaW5hbmNlIGRhdGEgYW5kIGVzdGltYXRlIGZpbmFuY2UgbW9kZWxzLgoKLSBBcyB3ZSBnbyB0aHJvdWdoIHRoZSBhbmFseXNlcyBhbmQgbW9kZWxzIGluIGNsYXNzLCBwbGVhc2UgZW50ZXIgdGhlIGNvZGUgYW5kIGV4ZWN1dGUgaXQgb24geW91ciBjb21wdXRlci4KCjwhLS0gWW91IGFyZSB3ZWxjb21lIHRvIGJyaW5nIHlvdXIgb3duIG5vdGVib29rIGNvbXB1dGVyIHRvIHRoZSBsYWIgc2Vzc2lvbnMgaWYgeW91IHdpc2guIFlvdSB3aWxsIGJlZW4gdG8gY29ubmVjdCB0byB0aGUgaW50ZXJuZXQuIC0tPgoKLS0tLQoKIyMgQWZ0ZXIgaW5zdGFsbGluZyB0aGUgc29mdHdhcmUsIG9wZW4gUlN0dWRpbwoKPHA+CgotIEl0IHNob3VsZCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXMuCgo8cD4KCiFbXShhc3NldHMvcDEucG5nKQoKLS0tLQoKIyMjIFNldCB0aGUgZm9sZGVyIFJTdHVkaW8gdXNlcyB3aGVuIG5vdCBpbiBhIHByb2plY3QKCjxwPgoKLSBGcm9tICJQcmVmZXJlbmNlcyIgc2V0IHRoZSBkZWZhdWx0IGZvbGRlciB0byB5b3VyIGRvY3VtZW50cyBvciBvdGhlciBjb252ZW5pZW50IGZvbGRlci4gCgotIEkgc2V0IG1pbmUgdG8gbXkgRHJvcGJveCBmb2xkZXIuCgotIEFmdGVyIHlvdSBoYXZlIHNldCB0aGUgZm9sZGVyLCBxdWl0IGFuZCByZW9wZW4gUlN0dWRpby4KCjxwPgoKIVtdKGFzc2V0cy9wMi5wbmcpCgotLS0tCgojIyBNYWtlIGEgInByb2plY3QiIGZvciB0aGlzIGNvdXJzZQoKPHA+CgotIEEgcHJvamVjdCBpcyBhIGZvbGRlciB3aGVyZSB5b3UgY2FuIGtlZXAgZGF0YSwgY29kZSBhbmQgZG9jdW1lbnRzIHRvZ2V0aGVyLgoKLSBZb3UgY2FuIGhhdmUgc2V2ZXJhbCBkaWZmZXJlbnQgcHJvamVjdHMgYW5kIHNldCBSIHRvIHN0YXJ0IHVwIGRpZmZlcmVudGx5IGZvciBlYWNoIHByb2plY3QuIFByb2plY3RzIGFsbG93IHlvdSB0byBrZWVwIHlvdXIgZmlsZXMgb3JnYW5pc2VkLCBhbmQgbGV0IHlvdSBjdXN0b21pc2UgaG93IFIgd29ya3MuIAoKLSBJZiB5b3UgdXNlIFIgZm9yIG90aGVyIGNsYXNzZXMsIHlvdXIgc2VtaW5hciBvciBvdGhlciBwdXJwb3NlcywgeW91IGNhbiBjcmVhdGUgb3RoZXIgcHJvamVjdHMgZm9yIHRob3NlLiAKCi0gRWFjaCBwcm9qZWN0IHdpbGwgaGF2ZSBhIHNlcGFyYXRlIGZvbGRlciBhbmQgZmlsZXMgdG8gc2F2ZSB0aGUgZGF0YSBpbiB5b3VyIGVudmlyb25tZW50LCB5b3VyIGhpc3Rvcnkgb2YgY29kZSBleGVjdXRlZCBpbiB0aGUgY29uc29sZSwgYW5kIHRoZSB3YXkgeW91IGhhdmUgUiBjb25maWd1cmVkLgoKLSBNYWtlIGEgbmV3IHByb2plY3QgZnJvbSB0aGUgUHJvamVjdHMgbWVudSBhdCB0aGUgdG9wLXJpZ2h0IG9mIHRoZSBzY3JlZW4uCgo8cD4KCiFbXShhc3NldHMvcDMucG5nKQoKLS0tLQoKIyMgQ2xpY2sgIk5ldyBEaXJlY3RvcnkiIGZvciB5b3VyIHByb2plY3QKCjxwPgoKIVtdKGFzc2V0cy9wNC5wbmcpCgotLS0tCgojIyBTZWxlY3QgIk5ldyBQcm9qZWN0IgoKPHA+CgohW10oYXNzZXRzL3A1LnBuZykKCi0tLS0KCiMjIEdpdmUgdGhlIHByb2plY3QgZm9sZGVyIGEgbmFtZQoKPHA+CgotIEkgdXNlIHRoZSBuYW1lICJwb3J0Zm9saW9tbmd0Ii4KCiAgICAtIEkgb3JpZ2luYWxseSBtYWRlIHRoaXMgZ3VpZGUgZm9yIG15IGNvdXJzZSBQb3J0Zm9saW8gTWFuYWdtZW50LiBGb3IgRmluYW5jZSBEYXRhIFdvcmtzaG9wLCB5b3UgY2FuIHVzZSBhIG1vcmUgYXBwcm9wb3JpYXRlIG5hbWUsIHN1Y2ggYXMgIkZEVyIuCgotIENsaWNrICJDcmVhdGUgUHJvamVjdCIuCgo8cD4KCiFbXShhc3NldHMvcDYucG5nKQoKLS0tLQoKIyMgWW91ciBkZXNrdG9wIHNob3VsZCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXMKCjxwPgoKIVtdKGFzc2V0cy9wNy5wbmcpCgo8IS0tIDxicj4gLS0+Cgo8IS0tIC0gVXNlIHRoZSBmb2xsb3dpbmcgY29kZSB0byBjaGVjayB0aGF0IHlvdXIgUiBzZXNzaW9uIGlzIG9wZXJhdGluZyBpbiB5b3VyIHByb2plY3QgZm9sZGVyLiAtLT4KCjwhLS0gPHA+IC0tPgoKPCEtLSBgYGB7ciwgZXZhbD1GQUxTRX0gLS0+CjwhLS0gZ2V0d2QoKSAtLT4KPCEtLSBgYGAgLS0+CgotLS0tCgojIyBTZXQgdGhlICJQcm9qZWN0IE9wdGlvbnMiCgo8cD4KCi0gRmluZCB0aGUgIlByb2plY3QgT3B0aW9ucyIgZnJvbSB0aGUgcHJvamVjdCBtZW51IGF0IHRoZSB0b3AtcmlnaHQgb2YgeW91ciBzY3JlZW4uCgo8cD4KCiFbXShhc3NldHMvcDgucG5nKQoKLS0tLQoKIyMgU2V0IHRoZSB0aHJlZSBvcHRpb25zIHRvICJZZXMiCgo8cD4KCi0gVGhpcyBtZWFucyB5b3VyIGRhdGEgYW5kIGhpc3Rvcnkgb2YgY29tbWFuZHMgd2lsbCBiZSBzYXZlZCBxdWVuIHlvdSBxdWl0IGFuZCByZXN0b3JlZCB3aGVuIHlvdSBvcGVuIHlvdXIgcHJvamVjdCB0aGUgbmV4dCB0aW1lLgoKPHA+CgohW10oYXNzZXRzL3A5LnBuZykKCi0tLS0KCiMjIFJTdHVkaW8gaGFzIGZvdXIgcGFuZXMKCjxwPgoKIVtdKGFzc2V0cy9wMTAucG5nKQoKPHA+CgotIFBhbmUgMSBpcyB0aGUgc291cmNlIHBhbmUgd2hlcmUgeW91IGNhbiBvcGVuIGFuZCB3b3JrIG9uIHZhcmlvdXMgdHlwZXMgb2YgY29kZSBmaWxlcyBvciBkb2N1bWVudHMuIFlvdSBhbHNvIGRpc3BsYXkgb2JqZWN0cyBpbiB0aGUgc291cmNlIHBhbmUuIAoKICAgIC0gUiBpcyBhbiBvYmplY3Qgb3JpZW50ZWQgbGFuZ3VhZ2Ugd2hpY2ggbWVhbnMgZXZlcnl0aGluZyBpcyBhbiBvYmplY3Qgd2l0aCBjZXJ0YWluIGF0dHJpYnV0ZXMsIGUuZy4gYSBtYXRyaXggb2YgZGF0YSBvciBhIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyBkYXRhLgogICAgCiAgICAtIE9iamVjdHMgY2FuIGludGVyYWN0IHdpdGggZWFjaCBvdGhlciB0byBjaGFuZ2UgdGhlaXIgYXR0cmlidXRlcywgb3IgY3JlYXRlIG90aGVyIG9iamVjdHMuCiAgICAKICAgIC0gU29tZSBpbXBvcnRhbnQgdHlwZXMgb2Ygb2JqZWN0cyBhcmU6IHZlY3RvcnMsIGxpc3RzLCBhcnJheXMsIG1hdHJpY2VzLCB0YWJsZXMsIGRhdGEgZnJhbWVzLCBmdW5jdGlvbnMuCgo8cD4KCi0gUGFuZSAyIGlzIHRoZSBjb25zb2xlIHdoZXJlIHlvdSBjYW4gZW50ZXIgYW5kIGV4ZWN1dGUgY29kZS4KCi0gUGFuZSAzIGNvbnRhaW5zIHRoZSBlbnZpcm9ubWVudCBhbmQgaGlzdG9yeSB0YWJzLiBUaGUgZW52aXJvbm1lbnQgc2hvd3MgYWxsIG9iamVjdHMgdGhhdCBhcmUgbG9hZGVkIGZvciB1c2UgKGl0IGlzIGVtcHR5IG5vdykuIFRoZSBoaXN0b3J5IHRhYiBzaG93cyB0aGUgY29kZSB5b3UgaGF2ZSBleGVjdXRlZCBpbiB0aGUgY29uc29sZS4gCgotIFBhbmUgNCBjb250YWlucyBhIG51bWJlciBvZiB0YWJzIHNob3dpbmcgeW91ciBmb2xkZXJzIGFuZCBmaWxlcywgcGxvdHMgeW91IGhhdmUgZHJhd24sIHBhY2thZ2VzLCBhIGhlbHAgd2luZG93LgoKLS0tLQoKIyMgUGFja2FnZXMKCjxwPgoKIVtdKGFzc2V0cy9wMTEucG5nKQoKPHA+CgotIFBhY2thZ2VzIGV4dGVuZCB0aGUgZnVuY3Rpb25hbGl0eSBvZiBSLgoKLSBQYWNrYWdlcyBjb250YWluIGZ1bmN0aW9ucywgZGF0YSBhbmQgb3RoZXIgb2JqZWN0cy4gVGhleSBhcmUgZGVzaWduZWQgdG8gcGVyZm9ybSBjZXJ0YWluIHR5cGVzIG9mIGRhdGEgbWFuaXB1bGF0aW9uLCBhbmFseXNpcywgZXN0aW1hdGlvbiwgdmlzdWFsaXNhdGlvbiwgb3B0aW1pc2F0aW9uLCBkb2N1bWVudCBjcmVhdGlvbiwgZXRjLiAKCi0gU29tZSBwYWNrYWdlcyBhcmUgcGFydCBvZiB0aGUgZGVmYXVsdCBSIGluc3RhbGxhdGlvbiwgY2FsbGVkICJCYXNlIFIiLCBhbmQgdGhlcmUgYXJlIGEgaHVnZSBudW1iZXIgb2YgYWRkaXRpb25hbCBwYWNrYWdlcyBhdmFpbGFibGUgdGhhdCBhbGxvdyB5b3UgdG8gZG8gYWxtb3N0IGFueXRoaW5nIHdpdGggUi4KCi0gV2Ugd2lsbCB1c2Ugc2V2ZXJhbCBwYWNrYWdlcyBpbiB0aGlzIGNvdXJzZS4KCi0gVGhlcmUgYXJlIHR3byBzdGVwcyB0byB1c2luZyBhIHBhY2thZ2UuCgogICAgMS4gSW5zdGFsbCB0aGUgcGFja2FnZS4gVGhpcyBkb3dubG9hZHMgdGhlIGxhdGVzdCB2ZXJzb24gb2YgdGhlIHBhY2thZ2UgZnJvbSBhbiBSIHJlcG9zaXRvcnkgYW5kIHNhdmVzIGl0IG9uIHlvdXIgY29tcHV0ZXIuCgogICAgMi4gTG9hZCBhIHBhY2thZ2UgZm9yIHVzZS4gV2hlbiB5b3Ugd2FudCB0byB1c2UgYSBwYWNrYWdlIHlvdSBtdXN0IGxvYWQgaXQgZmlyc3Qgd2l0aCB0aGUgbGlicmFyeSBjb21tYW5kLiAKCjxwPgoKLSBUbyBpbnN0YWxsIGEgcGFja2FnZSwgY2xpY2sgdGhlIGluc3RhbGwgYnV0dG9uLCB0eXBlIGluIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIGFuZCBoaXQgaW5zdGFsbC4KCi0gSW5zdGFsbCB0aGUgZm9sbG93aW5nIHBhY2thZ2VzOiBBRVIsIGR5bmxtLCBmR2FyY2gsIEZpbkNhbCwga2FibGVFeHRyYSwgTUFTUywgcmVzaGFwZTIsIHN0YXJnYXplciwgdGlkeXF1YW50LCB0aWR5dmVyc2UsIHdlc2FuZGVyc29uLCB4dGFibGUuCgogICAgLSBOb3RlIHRoYXQgUiBpcyBjYXNlLXNlbnNpdGl2ZSwgdGh1cyB1cHBlci0gYW5kIGxvd2VyLWNhc2UgbGV0dGVycyBhcmUgaW50ZXJwcmV0ZWQgYXMgYmVpbmcgZGlmZmVyZW50LgoKPHA+CgohW10oYXNzZXRzL3AxMi5wbmcpCgo8cD4KCi0gQWx0ZXJuYXRpdmVseSwgaW5zdGFsbCB0aGUgcGFja2FnZXMgYnkgcnVubmluZyB0aGUgZm9sbG93aW5nIGNvZGUgaW4gdGhlIGNvbnNvbGUuCgo8cD4KCmBgYHtyLCBldmFsPUZBTFNFfQppbnN0YWxsLnBhY2thZ2VzKCJBRVIiLCAiZHlubG0iLCAiZkdhcmNoIiwgIkZpbkNhbCIsICJrYWJsZUV4dHJhIiwgIk1BU1MiLCAicmVzaGFwZTIiLCAic3RhcmdhemVyIiwgInRpZHlxdWFudCIsICJ0aWR5dmVyc2UiLCAid2VzYW5kZXJzb24iLCAieHRhYmxlIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKYGBgCgo8cD4KCi0gSW5zdGFsbGF0aW9uIG9mIHBhY2thZ2VzIHdpbGwgdGFrZSBzb21lIHRpbWUuIE91ciBsaXN0IG9mIHBhY2thZ2VzIHdpbGwgcmVxdWlyZSBzZXZlcmFsIGFkZGl0aW9uYWwgcGFja2FnZXMsIGNhbGxlZGUgZGVwZW5kZW5jaWVzLCB0byBiZSBkb3dubG9hZGVkLgoKICAgIC0gSWYgeW91IGFyZSBhc2tlZCBfIkRvIHlvdSB3YW50IHRvIGluc3RhbGwgZnJvbSBzb3VyY2VzIHRoZSBwYWNrYWdlcyB3aGljaCBuZWVkIGNvbXBpbGF0aW9uPyAoWWVzL25vL2NhbmNlbCkiXyBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24sIHlvdSBjYW4gYW5zd2VyICJuIi4KCiAgICAtIElmIGFuIGluc3RhbGxhdGlvbiByZXN1bHRzIGluIGEgbWVzc2FnZSBsaWtlIF8iSW5zdGFsbGF0aW9uIG9mIHBhY2thZ2UgWCBoYWQgbm9uLXplcm8gZXhpdCBzdGF0dXMiXyB0aGUgcGFja2FnZSB3YXMgbm90IGluc3RhbGxlZC4gVHJ5IGFnYWluLiBJZiB5b3Ugc3RpbGwgaGF2ZSBhIHByb2JsZW0sIGNvbnRhY3QgbWUuCiAgICAKICAgIC0gQSBtZXNzYWdlIGxpa2UgXyJUaGUgZG93bmxvYWRlZCBzb3VyY2UgcGFja2FnZXMgYXJlIGluICdmb2xkZXIgbG9jYXRpb24nIl8gbWVhbnMgdGhlIHBhY2thZ2VzIHdlcmUgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZC4KICAgIAo8cD4KCi0gUGFja2FnZXMgbmVlZCBvbmx5IGJlIGluc3RhbGxlZCBvbiB5b3VyIGNvbXB1dGVyIG9uY2UsIGJ1dCB0aGV5IHNob3VsZCBiZSB1cGRhdGVkIGZyb20gdGltZSB0byB0aW1lLiAKCi0gV2hlbiB5b3Ugd2lzaCB0byB1c2UgYSBwYWNrYWdlLCBpdCBtdXN0IGJlIGxvYWRlZCB1c2luZyB0aGUgbGlicmFyeSBjb21tYW5kLiBGb3IgZXhhbXBsZSwgdG8gbG9hZCB0aGUgQUVSIHBhY2thZ2U6Cgo8cD4KCmBgYHtyLCBldmFsPUZBTFNFfQpsaWJyYXJ5KEFFUikKYGBgCgo8cD4KCi0gQW5vdGhlciB3YXkgdG8gbG9hZCBhIHBhY2thZ2UgaXMgdG8gdGljayB0aGUgYm94IG5leHQgdG8gdGhlIHBhY2thZ2UgaW4gdGhlIFBhY2thZ2VzIHRhYi4gVGhlIHBhY2thZ2VzIHRhYiBzaG93cyB5b3UgYWxsIHBhY2thZ2VzIHRoYXQgeW91IGhhdmUgaW5zdGFsbGVkLgoKPHA+CgohW10oYXNzZXRzL3AxMy5wbmcpCgo8cD4KCi0gSWYgeW91IGdldCBhbiBlcnJvciBzYXlpbmcgUiBjYW5ub3QgZmluZCBhIGZ1bmN0aW9uIHdoZW4geW91IGFyZSB0cnlpbmcgdG8gZXhlY3V0ZSBjb2RlLCBpdCBpcyBhbG1vc3QgYWx3YXlzIGJlY2F1c2UgeW91IGhhdmUgZWl0aGVyIGEpIF9fbm90IGxvYWRlZCB0aGUgcGFja2FnZV9fIHRoYXQgY29udGFpbnMgdGhlIGZ1bmN0aW9uLCBvciBiKSBfX21pc3R5cGVkIHRoZSBmdW5jdGlvbl9fLgoKLS0tLQoKIyMgV2hlcmUgYXJlIG15IGZpbGVzPwoKPHA+CgotIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBpcyB3aGVyZSBSIHdpbGwgbG9vayBmb3IgeW91ciBmaWxlcyBhbmQgc2F2ZSBmaWxlcy4KCi0gU2hvdyB5b3VyIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnk6Cgo8cD4KCmBgYHtyLCBldmFsPUZBTFNFfQpnZXR3ZCgpCmBgYAogCiA8cD4KIAotIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBpcyBzZXQgYnkgeW91ciBwcm9qZWN0LgogCi0gSWYgeW91IHdhbnQgdG8gY2hhbmdlIHlvdXIgd29ya2luZyBkaXJlY3RvcnkgdGVtcG9yYXJpbHkgeW91IGNhbiBzZXQgaXQgdG8gYW5vdGhlciBwYXRoLiBIZXJlIGlzIGFuIGV4YW1wbGUgZm9yIG15IGZvbGRlcnM6CgpgYGB7cixldmFsPUZBTFNFfQpzZXR3ZCgiL1VzZXJzL0NsaW50b24vRHJvcGJveC9zeW5jZF9yX2RhdGEvZWNvbm9tZXRyaWNzIikKYGBgCgotIElmIHlvdSB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IGlzIGEgZm9sZGVyIG9uIGEgbmV0d29yayBkcml2ZSBvciBvbiB0aGUgY2xvdWQgKGxpa2UgRHJvcGJveCBvciBHb29nbGUgRHJpdmUpIHRoYXQgaXMgc3luY2VkIHRvIHlvdXIgY29tcHV0ZXIncyBoYXJkIGRyaXZlLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHVzZSBpdCB3aXRoIFJTdHVkaW8gb24gbXVsdGlwbGUgY29tcHV0ZXJzLgoKLS0tLSAgCgojIyBTcGVjaWFsIEhJRERFTiBSIGZpbGVzIGluIHlvdXIgd29ya2luZyBkaXJlY3RvcnkgIAoKPHA+CgotIFJTdHVkaW8gdXNlcyB0aHJlZSBpbXBvcnRhbnQgaGlkZGVuIGZpbGVzLiBZb3UgY2FuIHNlZSB0aGVtIGluIHRoZSBSU3R1ZGlvIGZpbGVzIHBhbmUgYnV0IHVzdWFsbHkgbm90IGluIHlvdXIgb3BlcmF0aW5nIHN5c3RlbS4KCiAgICAtIF9fLlJEYXRhX18gaG9sZHMgdGhlIG9iamVjdHMgdGhhdCBhcmUgbG9hZGVkIGluIHlvdXIgZW52aXJvbm1lbnQuCgogICAgLSBfXy5SSGlzdG9yeV9fIGhvbGRzIHRoZSBoaXN0b3J5IG9mIHRoZSBjb2RlIHlvdSBoYXZlIGV4ZWN1dGVkIGluIHRoZSBjb25zb2xlLgoKICAgIC0gX18uUnByb2ZpbGVfXyBob2xkcyBzcGVjaWZpYyBzZXQtdXAgaW5mb3JtYXRpb24gZm9yIHRoZSBwcm9qZWN0IHlvdSBhcmUgd29ya2luZyBpbi4KCjxwPgoKLSBIZXJlIGFyZSB0aGUgaGlkZGVuIGZpbGVzIGluIG15IHdvcmtpbmcgZGlyZWN0b3J5IHNob3duIGluIHJlZCBhbmQgdGhlIHByb2plY3QgZmlsZSB3aGljaCBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCBteSBwcm9qZWN0IGluIGJsdWUuOgoKPHA+CgohW10oYXNzZXRzL3AxNC5wbmcpCgotLS0tCgojIyBVc2luZyB0aGUgIi5ScHJvZmlsZSIgZmlsZSB0byBjb25maWd1cmUgYW4gUiBzZXNzaW9uCgo8cD4KCi0gVGhlIC5ScHJvZmlsZSBmaWxlIGV4ZWN1dGVzIGNvZGUgYXMgUiBzdGFydHMgdXAuIFlvdSBjYW4gdXNlIHRoaXMgZmlsZSB0byBhdXRvbWF0aWNhbGx5IGxvYWQgdGhlIHBhY2thZ2VzIHlvdSB3aWxsIG5lZWQgdG8gdXNlIGZvciB0aGlzIGNvdXJzZSBhbmQgdG8gc2V0IHNvbWUgUiBvcHRpb25zLiBUaHVzIC5ScHJvZmlsZSBhbGxvd3MgeW91IHRvIGN1c3RvbWlzZSB0aGUgc3RhcnQtdXAgb2YgUi4KCiAgICAtIFJlbWVtYmVyIHRoYXQgdGhlIHBhY2thZ2VzIG11c3QgYWxyZWFkeSBiZSBpbnN0YWxsZWQgb24geW91ciBjb21wdXRlciB0byBiZSBsb2FkZWQgYnkgdGhlIC5ScHJvZmlsZSBmaWxlLgogICAgCjxwPgoKLSBIZXJlIGlzIHRoZSBjb2RlIHlvdSB3aWxsIG5lZWQgaW4geW91ciAuUnByb2ZpbGUgZmlsZSBmb3IgdGhpcyBjb3Vyc2UuCgpgYGB7ciwgZXZhbD1GQUxTRX0KIyBQb3J0Zm9saW8gTWFuYWdlbWVudCAuUnByb2ZpbGUgZmlsZQoKIyBBdXRvLWxvYWQgcGFja2FnZXM6CmxpYnJhcnkoQUVSKQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkoZHlubG0pCmxpYnJhcnkoZkJhc2ljcykKbGlicmFyeShmR2FyY2gpCmxpYnJhcnkoRmluQ2FsKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShtYWdyaXR0cikKbGlicmFyeShNQVNTKQpsaWJyYXJ5KG1hdHJpeFN0YXRzKQpsaWJyYXJ5KHF1YWRwcm9nKQpsaWJyYXJ5KHF1YW50bW9kKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShyZXNoYXBlMikKbGlicmFyeShybWFya2Rvd24pCmxpYnJhcnkoc3RhcmdhemVyKQpsaWJyYXJ5KHRpbWVTZXJpZXMpCmxpYnJhcnkodHNlcmllcykKbGlicmFyeSh3ZXNhbmRlcnNvbikKbGlicmFyeSh4dGFibGUpCmxpYnJhcnkoeHRzKQpsaWJyYXJ5KHRpZHlxdWFudCkKbGlicmFyeSh0aWR5dmVyc2UpCgojIFNldCBzb21lIG9mIFIgb3B0aW9uczoKb3B0aW9ucyhwcm9tcHQ9IlI+ICIsIHNjaXBlbj05OTksIGRpZ2l0cz00LCB3aWR0aD04MCkKYGBgCgo8cD4KCi0gVG8gbWFrZSB5b3VyIC5ScHJvZmlsZSBmaWxlLCBmb2xsb3cgdGhlc2Ugc3RlcHMuCgotIENyZWF0ZSBhIG5ldyBSIFNjcmlwdCBmaWxlLgogICAgCjxwPgoKIVtdKGFzc2V0cy9wMTUucG5nKQoKPHA+CgotIFlvdXIgUiBTY3JpcHQgZmlsZSBpcyBzaG93biBiZWxvdy4gQW4gUiBTY3JpcHQgZmlsZSBpcyBhIHRleHQgZmlsZSB0aGF0IHlvdSBjYW4gc2F2ZSBjb2RlIGluLgoKPHA+CgohW10oYXNzZXRzL3AxNi5wbmcpCgo8cD4KCi0gQ29weSBhbGwgb2YgdGhlIGNvZGUgZnJvbSB0aGUgUG9ydGZvbGlvIE1hbmFnZW1lbnQgLlJwcm9maWxlIGZpbGUgYWJvdmUgYW5kIHBhc3RlIGl0IGludG8geW91ciBSIFNjcmlwdCBmaWxlLiAKCjxwPgoKIVtdKGFzc2V0cy9wMTcucG5nKQoKPHA+CgotIFNhdmUgdGhlIFIgU2NyaXB0IGZpbGUgaW4geW91ciB3b3JraW5nIGRpcmVjdG9yeSAoeW91ciBwcm9qZWN0IGRpcmVjdG9yeSkuIFRoZSBmaWxlIG5hbWUgZG9lcyBub3QgbWF0dGVyIGZvciBub3cuCgo8cD4KCiFbXShhc3NldHMvcDE4LnBuZykKPHA+CgohW10oYXNzZXRzL3AxOS5wbmcpCgo8cD4KCi0gUmVuYW1lIHRoZSBmaWxlIGFzICIuUnByb2ZpbGUiLgoKPHA+CgohW10oYXNzZXRzL3AyMC5wbmcpCjxwPgoKIVtdKGFzc2V0cy9wMjEucG5nKQo8cD4KCi0gWW91IHNob3VsZCBub3cgaGF2ZSB5b3VyIC5ScHJvZmlsZSBmaWxlIGluIHlvdXIgd29ya2luZyBkaXJlY3RvcnkuIElmIHlvdSByZXN0YXJ0IFJTdHVkaW8sIHlvdXIgcGFja2FnZXMgc2hvdWxkIGxvYWQgYXV0b21hdGljYWxseS4KCi0gWW91IG1heSBlZGl0IHRoZSAuUnByb2ZpbGUgZmlsZSB0byBhZGQgbGlicmFyeSBjb21tYW5kcyBmb3IgYWRkaXRpb25hbCBwYWNrYWdlcyB5b3UgbWlnaHQgd2FudCB0byBsb2FkIHdoZW4gUiBzdGFydHMgdXAuCgotLS0tCgojIyBSbWFya2Rvd24gYW5kIE5vdGVib29rcwoKPHA+CgotIF9fUm1hcmtkb3duX18gYWxsb3dzIGR5bmFtaWMgZG9jdW1lbnRzIHRvIGJlIGNyZWF0ZWQgaW4gUiB0aGF0IGNvbnRhaW4gd3JpdHRlbiB0ZXh0LCBSIGNvZGUgYW5kIG91dHB1dCBmcm9tIHRoZSBjb2RlLiAKCi0gSSB3aWxsIGFzayB5b3UgdG8gZG8gc29tZSBhc3NpZ25tZW50cyBpbiBhbiBSIE5vdGVib29rIHVzaW5nIG1hcmtkb3duLiAKCiAgICAtIFRoaXMgZ3VpZGUgZm9yIHNldHRpbmctdXAgUiBhbmQgUlN0dWRpbyB3YXMgbWFkZSBpbiBhbiBSIE5vdGVib29rLiBJZiB5b3UgbG9vayBhdCB0aGUgdG9wIG9mIHRoZSBwYWdlIHlvdSBjYW4gc2VlIGEgYnV0dG9uIGxhYmVsbGVkICJDb2RlIiB3aGljaCBhbG93cyB5b3UgdG8gZG93bmxvYWQgdGhlIGNvZGUgSSB1c2VkIHRvIG1ha2UgdGhpcyBIVE1MIGZpbGUuCiAgICAKPHA+CgotIEEgbWFya2Rvd24gZG9jdW1lbnQgaXMgd3JpdHRlbiBpbiB1c2luZyBjb2RpbmcgY2FsbGVkIG1hcmtkb3duLCB3aGljaCBpcyBhbiBlYXN5LXRvLXdyaXRlIHBsYWluIHRleHQgZm9ybWF0IHRoYXQgaXMgcmVsYXRlZCB0byBUZVggKG9yIExhVGVYKS4KCi0gQSBUZVggaW5zdGFsbGF0aW9uIGlzIHJlcXVpcmVkIHRvIHVzZSBSbWFya2Rvd24sIHN1Y2ggYXMgTWFjVGV4IChmb3IgTWFjIE9TKSBodHRwOi8vd3d3LnR1Zy5vcmcvbWFjdGV4LyBvciBNaUtUZVggKGNyb3NzLXBsYXRmb3JtKSBodHRwczovL21pa3RleC5vcmcvZG93bmxvYWQuIElmIHlvdSB1c2UgTGFUZVggdG8gd3JpdGUgZG9jdW1lbnRzLCB5b3Ugd2lsbCBhbHJlYWR5IGhhdmUgdGhpcy4gSWYgbm90LCB0aGUgZWFzaWVzdCB3YXkgdG8gZ2V0IGEgVGVYIGluc3RhbGxhdGlvbiBmb3IgbWFya2Rvd24gaXMgdmlhIHRoZSBUaW55VGVYIHBhY2thZ2UuCgotLS0tCgojIyBJbnN0YWxsIFRpbnlUZVggdXNpbmcgdGhlIHBhY2thZ2UgY2FsbGVkIHRpbnl0ZXgKCjxwPgoKLSBZb3UgaGF2ZSBhbHJlYWR5IGluc3RhbGxlZCB0aGUgcGFja2FnZSBjYWxsZWQgdGlueXRleC4gRXhlY3V0aW5nIHRoZSBjb2RlIGJlbG93IGluIHRoZSBjb25zb2xlIHdpbGwgZG93bmxvYWQgdGhlIFRpbnlUZVggZmlsZXMgZnJvbSB0aGUgaW50ZXJuZXQgYW5kIGluc3RhbGwgdGhlbSBvbiB5b3VyIGNvbXB1dGVyIHNvIHRoYXQgeW91IGNhbiBtYWtlIG1hcmtkb3duIGRvY3VtZW50cy4gCgo8cD4KCmBgYHtyLCBldmFsPUYsIG1lc3NhZ2U9RkFMU0V9CnRpbnl0ZXg6Omluc3RhbGxfdGlueXRleCgpCmBgYAoKPHA+CgotIFRoaXMgd2lsbCB0YWtlIHNvbWUgdGltZSB0byBkb3dubG9hZC4KCi0gTm90ZSB0aGF0IHlvdSBkbyBub3QgbmVlZCB0byBkbyB0aGlzIGlmIHlvdSB1c2UgUlN0dWRpbyBDbG91ZCBhcyBUaW55VGVYIGlzIHByZS1pbnN0YWxsZWQuCgotIFdoZW4gdGhlIGluc3RhbGxhdGlvbiBoYXMgZmluaXNoZWQsIHJlc3RhcnQgUlN0dWRpby4KCi0tLS0KCiMjIFRlc3QgeW91ciBSbWFya2Rvd24gZW52aXJvbm1lbnQKCi0gUnVuIHRocm91Z2ggYSBzaW1wbGUgdGVzdCB0byBzZWUgaWYgeW91IGNhbiBtYWtlIGFuIFIgTm90ZWJvb2ssIGFzIGZvbGxvd3MuCgotIE9wZW4gYSBuZXcgUiBOb3RlYm9vay4KCjxwPgoKIVtdKGFzc2V0cy9wMjIucG5nKQoKPHA+CgotIFRoZSBub3RlYm9vayBhbHJlYWR5IGNvbnRhaW5zIGV4YW1wbGUgdGV4dCBhbmQgUiBjb2RlIHRoYXQgcGxvdHMgYSBzaW1wbGUgY2hhcnQuCgo8cD4KCiFbXShhc3NldHMvcDIzLnBuZykKCjxwPgoKLSBSdW4gdGhlIGNvZGUgYnkgcHJlc3NpbmcgIlJ1biBBbGwiIGZyb20gdGhlICJSdW4iIG1lbnUuCgo8cD4KCiFbXShhc3NldHMvcDI0LnBuZykKCjxwPgoKLSBBZnRlciB5b3UgaGF2ZSBydW4gdGhlIGNvZGUsIHlvdSAgc2hvdWxkIHNlZSB0aGUgcGxvdCBhcHBlYXIuCgotIEluY2x1ZGUgeW91ciBuYW1lIGFzIEkgaGF2ZSBhdCB0aGUgdG9wIG9mIHRoZSBOb3RlYm9vay4KCjxwPgoKIVtdKGFzc2V0cy9wMjUucG5nKQoKPHA+CgotIFNhdmUgdGhlIGZpbGUgdG8geW91ciB3b3JraW5nIGRpcmVjdG9yeS4gCgo8cD4KCiFbXShhc3NldHMvcDI2LnBuZykKCjxwPgoKLSBZb3Ugc2hvdWxkIHNlZSB0d28gZmlsZXMgYXBwZWFyLiAKCiAgICAtIFlvdXIgY29kZSBpcyBpbiB0aGUgZmlsZSB3aXRoIHRoZSBleHRlbnNpb24gIi5SbWQiLgogICAgCiAgICAtIFlvdXIgSFRNTCBSIE5vdGVib29rIGhhcyB0aGUgZXh0ZW5zaW9uICIubmIuaHRtbCIuIAogICAgCiAgICA8cD4KCiFbXShhc3NldHMvcDI3LnBuZykKCjxwPgoKLSBPcGVuIHRoZSBIVE1MIGZpbGUgd2l0aCB5b3VyIGJyb3dzZXIuIEl0IHNob3VsZCBsb29rIGxpa2UgdGhpczoKCjxwPgoKIVtdKGFzc2V0cy9wMjgucG5nKQoKPHA+CgotIFdlbGwgZG9uZSEgWW91IGhhdmUgY3JlYXRlZCBhIE5vdGVib29rLgoKLS0tLQoKIyMgSW5mb3JtYXRpb24gb24gUm1hcmtkb3duIGFuZCBUaW55VGVYCgotIEluZm9ybWF0aW9uIG9uIFJtYXJrZG93biBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20vIGFuZCBhIHVzZWZ1bCBndWlkZSBpcyBhdCBodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24vIGFuZCBodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24tY29va2Jvb2svIGFuZCBodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24vLiBFYXN5IGFuZCBoZWxwZnVsIHZpZGVvIGxlc3NvbnMgY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tL2xlc3Nvbi0xLmh0bWwuCgotIFJlZmVyZW5jZSBtYXRlcmlhbCBmb3IgVGlueVRlWCBpcyBhdCBodHRwczovL3lpaHVpLm5hbWUvdGlueXRleC8uCgotLS0tCgojIyBSZXNvdXJjZXMgZm9yIFIKCjxwPgoKLSBUaGVyZSBhcmUgbWFueSBndWlkZXMgdG8gdXNpbmcgUiBhdmFpbGFibGUgb25saW5lLCBib3RoIGRvY3VtZW50cyBhbmQgdmlkZW9zLiAKCi0gQSBjb21wcmVoZW5zaXZlIGludHJvZHVjdGlvbiBpcyBhdmFpbGFibGUgb24gQUlNUyBAVmVuYWJsZXMyMDE5IGFuZCBhdCBodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy9kb2MvbWFudWFscy9yLXJlbGVhc2UvUi1pbnRyby5wZGYuIAoKLSBPdGhlciBSIGRvY3VtZW50YXRpb24gYW5kIGd1aWRlcyBmb3IgdmFyaW91cyBhcHBsaWNhdGlvbnMgY29udHJpYnV0ZWQgYnkgUiB1c2VycyBjYW4gYmUgZm91bmQgaGVyZTogaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvb3RoZXItZG9jcy5odG1sI2VuZ2xpc2guCgotIE15IFJBIFwmIFRBIGF0IEtvYmUgVW5pdmVyc2l0eSBwcm9kdWNlZCB0aGUgZm9sbG93aW5nIGd1aWRlcywgYXZhaWxhYmxlIGF0IFtNYXNzaW1pbGlhbm8ncyBSIFBhZ2Ugb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vbWFzc2ltaWxpYW5vai9SX2JlZ2lubmVycykuCgogICAgLSBSIGZvciBCZWdpbm5lcnMgIAogICAgLSBSIE1hcmtkb3duOiBOb3RlcyBmb3IgRWRpdGluZyAgCiAgICAtIExhVGVYOiBFZGl0aW5nIGZvciBNYXRoZW1hdGljcyAgCgotLS0tCgojIyBDUkFOIFRhc2sgVmlld3MKCjxwPgoKLSBDUkFOIFRhc2sgVmlld3MgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggUi4gUGFja2FnZXMgZXh0ZW5kIHRoZSBmdW5jdGlvbmFsaXR5IG9mIFIuIFRoZXkgcHJvdmlkZSByb3V0aW5lcyBmb3IgdmFyaW91cyB0eXBlcyBvZiBkYXRhIG1hbmlwdWxhdGlvbiwgbWF0aGVtYXRpY2FsIGFuZCBlY29ub21ldHJpYyBtb2RlbHMsIG9wdGltaXNhdGlvbiBtZXRob2RzLCBmaW5hbmNpYWwgbW9kZWxzIGFuZCBtb3JlLiBQYWNrYWdlcyBhcmUgY29uc3RhbnRseSBiZWluZyBkZXZlbG9wZWQgYW5kIHVwZGF0ZWQgYnkgUiB1c2Vycy4KCi0gVGhlIG1vc3QgdXNlZnVsIFRhc2sgVmlldyBmb3IgdGhpcyBjb3Vyc2UgaXM6ICAKCiAgICAtIEVtcGlyaWNhbCBmaW5hbmNlOiBodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvdmlld3MvRmluYW5jZS5odG1sIDxwLz4KICAgIAotIFRoZXNlIFRhc2sgVmlld3MgbWF5IGFsc28gYmUgaGVscGZ1bDoKCiAgICAtIEVjb25vbWV0cmljczogaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3ZpZXdzL0Vjb25vbWV0cmljcy5odG1sICAKCiAgICAtIFRpbWUgc2VyaWVzOiBodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvdmlld3MvVGltZVNlcmllcy5odG1sICAKIAotLS0tCgojIyBCb29rcyBvbiBSCgo8cD4KCi0gTWFueSBib29rcyBoYXZlIGJlZW4gcHVibGlzaGVkIG9uIHVzaW5nIFIsIHByb2dyYW1taW5nIHdpdGggUiwgYW5kIHVzaW5nIFIgZm9yIGZpbmFuY2UuCgogICAgLSBGaW5hbmNlOiBAQW5nMjAyMSwgQEJlbm5ldHQyMDE2LCBAQW5kcmVjdXQyMDEwLCBAVHNheTIwMTAsIEBUc2F5MjAxNC4KCiAgICAtIEVjb25vbWV0cmljczogQEtsZWliZXIyMDA4LCBASG9ybmlrMjAwOSwgQFBmYWZmMjAwOC4KICAgIAogICAgLSBDb2Rpbmc6IEBNYXRsb2ZmMjAxMS4KCi0tLS0KCiMjIFItQmxvZ2dlcnMgIAoKPHA+CgotIFItQmxvZ2dlcnMgaXMgYSBibG9nIHNpdGUgY29udGFpbmluZyBtYW55IGhlbHBmdWwgcG9zdHMgb24gdXNpbmcgUjogaHR0cDovL3d3dy5yLWJsb2dnZXJzLmNvbS8gIAoKLSBUaGUgcG9zdHMgb24gdGhlIHNpdGUgc2hvdyB0aGUgd2lkZSB2YXJpZXR5IG9mIHByb2JsZW1zIHRoYXQgY29kaW5nIGluIFIgY2FuIGJlIGFwcGxpZWQgdG8gKG5vdCBqdXN0IGZpbmFuY2UpLiBGb3IgZXhhbXBsZToKCiAgICAtIGh0dHBzOi8vd3d3LnItYmxvZ2dlcnMuY29tL3doby13cm90ZS10aGF0LWFub255bW91cy1ueXQtb3AtZWQtdGV4dC1zaW1pbGFyaXR5LWFuYWx5c2VzLXdpdGgtci8KCiAgICAtIGh0dHBzOi8vd3d3LnItYmxvZ2dlcnMuY29tL2hvdy10by1idWlsZC1hbmltYXRlZC1iYXItcGxvdHMtdXNpbmctci8KCjxwPgoKLSBBIGdvb2QgaW50cm9kdWN0aW9uIHRvIGxlYXJuaW5nIFI6IGh0dHBzOi8vd3d3LnItYmxvZ2dlcnMuY29tL2hvdy10by1sZWFybi1yLTIvCgotLS0tCgojIyBTZWFyY2ggIAoKPHA+CgotIExvdHMgb2YgaW5mb3JtYXRpb24gaXMgcG9zdGVkIG9ubGluZSBieSBSIHVzZXJzIGluY2x1ZGluZyBxdWVzdGlvbnMgYW5kIGFuc3dlcnMuICAKCi0gSWYgeW91IGFyZSBzdHVjaywgc2VhcmNoIGZvciBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgaGVscCB5b3UgYW5zd2VyIHlvdXIgcXVlc3Rpb24uIAoKLSByc2VlayBpcyBhIHNlYXJjaCBlbmdpbmUgZm9yIFI6IHd3dy5yc2Vlay5vcmcKCi0gVXNpbmcgYW5vdGhlciBzZWFyY2ggZW5naW5lIGxpa2UgR29vZ2xlOiAgCgogICAgLSAiZmlsZXR5cGU6UiByZWdyZXNzaW9uIOKAk3JlYm9sIiAgCgogICAgLSAiQ1JBTiByZWdyZXNzaW9uIiAgIAoKLS0tLQoKIyMgUlN0dWRpbyBLZXlib2FyZCBTaG9ydGN1dHMgKGZvciBNYWMpCgo8cD4KCi0gQ29kZSBjb21wbGV0aW9uOgogICAgLSBUeXBlIHBhcnQgb2YgdGhlIGZ1bmN0aW9uIHlvdSB3YW50IGFuZCB0aGVuIHByZXNzIHRoZSBUYWIga2V5LiAgCiAgICAtIEFsc28gd29ya3MgZm9yIGZ1bmN0aW9uIGFyZ3VtZW50cywgdGhhdCBpcyBwcmVzcyBUYWIgd2hlbiB5byB1YXJlIGluc2lkZSB0aGUgYnJhY2tldHMgb2YgYSBmdW5jdGlvbi4gIAogICAgLSBBbHNvIHJlY2FsbHMgb2JqZWN0IG5hbWVzLgoKPHA+CgotIFByZXNzIEYxIChvciBmbitGMSkgZm9yIGhlbHAgb24gYSBmdW5jdGlvbi4gCiAgCi0gUmV0cmlldmUgcHJldmlvdXMgY29tbWFuZHM6ICAKICAgIC0gUHJlc3MgdGhlIHVwIG9yIGRvd24gYXJyb3dzIHRvIHNjcm9sbCB0aHJvdWdoIHlvdXIgY29kZSBoaXN0b3J5LgogIAo8cD4KCi0gVmlldyBhIGxpc3Qgb2YgcHJldmlvdXMgY29tbWFuZHM6ICAKICAgIC0gUHJlc3MgQ29udHJvbCAob3IgQ29tbWFuZCkgYW5kIHRoZSB1cCBhcnJvdy4KCjxwPgoKLSBWaWV3IGEgbGlzdCBvZiBwcmV2aW91cyBjb21tYW5kcyB0aGF0IG1hdGNoIGEgcHJlZml4OiAgCiAgICAtIFR5cGUgdGhlIHByZWZpeCBhbmQgcHJlc3MgQ29udHJvbCAob3JDb21tYW5kKSBhbmQgdGhlIHVwIGFycm93LiAKCjxwPgoKLSBFbnRlciBhIGxpbmUgb2YgY29kZSBmcm9tIGFuIFIgc2NyaXB0IHRvIHRoZSBjb25zb2xlOgogICAgLSBDb21tYW5kIGFuZCBlbnRlci4KCjxwPgoKLSBFbnRlciBhIGxpbmUgb2YgY29kZSBmcm9tIGhpc3RvcnkgdG8gYW5kIFIgc2NyaXB0OgogICAgLSBTaGlmdCBhbmQgZW50ZXIuCgo8cD4KCi0gTW9yZTogIAogICAgLSBUb29scyAtPiBLZXlib2FyZCBTaG9ydGN1dHMgSGVscCAgCiAgICAtIGh0dHBzOi8vc3VwcG9ydC5yc3R1ZGlvLmNvbS9oYy9lbi11cy9hcnRpY2xlcy8yMDA3MTE4NTMgIAogICAgCi0tLS0KCjxwPgoKIMKpIENvcHlyaWdodCBDbGludG9uIFdhdGtpbnMgMjAyMQogCi0tLS0KCiMjIFJlZmVyZW5jZXMKCjxwPgo=